const User = require('../models/userModel');
// 特点是每次加密，即使使用相同的明文，都会生成不同的哈希值
const bcrypt = require('bcrypt');
const { Buffer } = require('buffer');
const fs = require('fs');
const path = require('path');
const ResultHandler = require('../utils/ResultHandler');
const jwt = require('../utils/jwt');
const { putOSS } = require("../utils/aliyunOss")

// SALT_ROUNDS 表示密码加密的成本因子，值越大加密越耗时但安全性越高。
const SALT_ROUNDS = 10

module.exports.register = async (req, res, next) => {
    try {
        const { username, password, email } = req.body;
        // 查找用户是否已存在
        const usernameCheck = await User.findOne({ username });
        if (usernameCheck) {
            return res.json(ResultHandler.error("Username already used"));
        }
        // 查找邮箱是否已存在
        const emailCheck = await User.findOne({ email });
        if (emailCheck) {
            return res.json(ResultHandler.error("Email already used"));
        }

        // 对密码进行加密：参数1：密码，参数2：加密的强度
        const hashedPassword = await bcrypt.hash(password, SALT_ROUNDS);
    
        // 创建用户
        await User.create({
            username, email, password: hashedPassword
        })

        return res.json(ResultHandler.success())
    }catch(err) {
        next(err);
    }
}

module.exports.login = async (req, res, next) => {
    try {
        const { username, password } = req.body;

        // 查找用户是否存在，并将查询结果转为普通对象
        const user = await User.findOne({ username }).lean();
        if (!user) {
            return res.json(ResultHandler.error("User not found"));
        }

        // 比较密码是否正确
        // 使用 bcrypt.compare() 比较用户输入的明文密码与数据库中存储的加密密码
        const isPasswordCorrect = await bcrypt.compare(password, user.password);
        if (!isPasswordCorrect) {
            return res.json(ResultHandler.error("Password incorrect"));
        }

        // 删除密码: 防止密码泄露
        delete user.password;

        // 创建 JWT Token 返回
        jwt.create(res, {
            id: user._id,
        })

        return res.json(ResultHandler.success(user))
    } catch(err) {
        next(err);
    }
}

module.exports.logOut = async (req, res, next) => {
    try {
        jwt.clear(res);
        return res.json(ResultHandler.success())
    } catch(err) {
        next(err);
    }
}

module.exports.getUserInfo = async (req, res, next) => {
    try{
        // 获取 cookie 中的 token
        const token = req.cookies.token;
        // 解析 token
        const { id } = jwt.decode(token);
        // 查询用户信息
        const user = await User.findById(id).lean();
        // 删除密码
        delete user.password;
        // 返回用户信息
        return res.json(ResultHandler.success(user))
    }catch(err){
        next(err)
    }
}

module.exports.getAllContacts = async(req, res, next) => {
    try {
        // 获取当前用户的 id
        const { id } = jwt.decode(req.cookies.token);
        // 获取所有用户
        let users = await User.find().lean();
        // 排除当前用户
        users = users.filter(user => user._id != id)
        // 返回用户列表
        return res.json(ResultHandler.success(users))
    } catch(err) {
        next(err);
    }
}

// 设置用户头像
module.exports.setAvatar = async(req, res, next) => {
    try {
        // 获取当前用户的 id
        const { id } = jwt.decode(req.cookies.token);
        // 获取需要修改的用户头像
        const { url } = req.body;
        // 修改用户头像, 更新到数据库
        await User.findByIdAndUpdate(id, { avatarImage: url, isAvatarImageSet: true });

        // 获取更新后的用户信息
        const user= await User.findById(id).lean()

        // 返回结果
        return res.json(ResultHandler.success(user))
    } catch(err) {
        next(err);
    }
}